package org.yelongframework.zip;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

import org.yelongframework.lang.Nullable;

/**
 * 压缩文件工具
 * 
 * @since 1.0.0
 */
public interface ZipFileTools {

	/**
	 * 压缩文件
	 * 
	 * @param zipFileEntrys 压缩文件项集合
	 * @param file          压缩后输出到的文件
	 * @throws ZipFileException 压缩文件异常
	 * @throws IOException      流异常
	 */
	void zip(ZipFileEntrys zipFileEntrys, File file) throws ZipFileException, IOException;

	/**
	 * 压缩文件
	 * 
	 * @param zipFileEntrys 压缩文件项集合
	 * @param outputStream  压缩后输出到的流
	 * @throws ZipFileException 压缩文件异常
	 * @throws IOException      流异常
	 */
	void zip(ZipFileEntrys zipFileEntrys, OutputStream outputStream) throws ZipFileException, IOException;

	/**
	 * 解压缩文件
	 * 
	 * @param zipFile       压缩文件
	 * @param unzipRootPath 解压后文件存储的根目录
	 * @throws ZipFileException 压缩文件异常
	 * @throws IOException      流异常
	 */
	void unzip(File zipFile, @Nullable String unzipRootPath) throws ZipFileException, IOException;

	/**
	 * 解压缩文件
	 * 
	 * @param zipFile              压缩文件
	 * @param unZipFileNameFuction 解压文件名称函数，制定文件解压后的目录文件
	 * @throws ZipFileException 压缩文件异常
	 * @throws IOException      流异常
	 */
	void unzip(File zipFile, UnZipFileNameFuction unZipFileNameFuction) throws ZipFileException, IOException;

	/**
	 * 解压缩文件
	 * 
	 * @param zipFile 压缩文件
	 * @return 压缩文件项集合
	 * @throws ZipFileException 压缩文件异常
	 * @throws IOException      流异常
	 */
	ZipFileEntrys unzip(File zipFile) throws ZipFileException, IOException;

}
